#include "TimerOne.h"
static uint8_t cube[8]={
0b10000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};
enum port_b {
PORTB_RCLK = 0,
PORTB_SRCLK = 1,
PORTB_LAYER_6 = 4,
PORTB_LAYER_7 = 5,
};
enum port_c {
PORTC_LAYER_0 = 0,
PORTC_LAYER_1 = 1,
PORTC_LAYER_2 = 2,
PORTC_LAYER_3 = 3,
PORTC_LAYER_4 = 4,
PORTC_LAYER_5 = 5,
};
enum port_d {
PORTD_SERIAL_0 = 0,
PORTD_SERIAL_1 = 1,
PORTD_SERIAL_2 = 2,
PORTD_SERIAL_3 = 3,
PORTD_SERIAL_4 = 4,
PORTD_SERIAL_5 = 5,
PORTD_SERIAL_6 = 6,
};
void callback(){
static uint8_t current_layer = 0;
static uint8_t layer = 0;
PORTC = 0x00;
PORTB &= ~((0x1 << PORTB_LAYER_6) | (0x1 << PORTB_LAYER_7));
PORTB &= ~(0x1 <<PORTB_RCLK);
for(int i = 0; i<8 ; i++){
layer = current_layer++ & 7;
PORTB &= ~(0x1 << PORTB_SRCLK);
PORTD = cube[i];
PORTB |= (0x1 << PORTB_SRCLK);
}
PORTB |= (0x1 << PORTB_RCLK);
if(layer <6){
PORTC = (0x1 << layer);
}
else if(current_layer == 6){
PORTB |= (0x1 << PORTB_LAYER_6);
}
else{
PORTB |= (0x1 << PORTB_LAYER_7);
}
}
void setup() {
// put your setup code here, to run once:
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
Timer1.initialize(2500);
Timer1.attachInterrupt(callback);
}
void loop() {
// put your main code here, to run repeatedly:
}
I2luY2x1ZGUgIlRpbWVyT25lLmgiCgpzdGF0aWMgdWludDhfdCBjdWJlWzhdPXsKICAwYjEwMDAwMDAwLAogIDBiMDAwMDAwMDAsCiAgMGIwMDAwMDAwMCwKICAwYjAwMDAwMDAwLAogIDBiMDAwMDAwMDAsCiAgMGIwMDAwMDAwMCwKICAwYjAwMDAwMDAwLAogIDBiMDAwMDAwMDAKICB9OyAKICAgCiAKICAKZW51bSBwb3J0X2IgewogICAgUE9SVEJfUkNMSyAgPSAwLAogICAgUE9SVEJfU1JDTEsgPSAxLAogICAgUE9SVEJfTEFZRVJfNiA9IDQsCiAgICBQT1JUQl9MQVlFUl83ID0gNSwKfTsKCmVudW0gcG9ydF9jIHsKICAgIFBPUlRDX0xBWUVSXzAgPSAwLAogICAgUE9SVENfTEFZRVJfMSA9IDEsCiAgICBQT1JUQ19MQVlFUl8yID0gMiwKICAgIFBPUlRDX0xBWUVSXzMgPSAzLAogICAgUE9SVENfTEFZRVJfNCA9IDQsCiAgICBQT1JUQ19MQVlFUl81ID0gNSwKfTsKCmVudW0gcG9ydF9kIHsKICAgIFBPUlREX1NFUklBTF8wICA9IDAsCiAgICBQT1JURF9TRVJJQUxfMSAgPSAxLAogICAgUE9SVERfU0VSSUFMXzIgID0gMiwKICAgIFBPUlREX1NFUklBTF8zICA9IDMsCiAgICBQT1JURF9TRVJJQUxfNCAgPSA0LAogICAgUE9SVERfU0VSSUFMXzUgID0gNSwKICAgIFBPUlREX1NFUklBTF82ICA9IDYsCn07Cgp2b2lkIGNhbGxiYWNrKCl7CiAgc3RhdGljIHVpbnQ4X3QgY3VycmVudF9sYXllciA9IDA7CiAgc3RhdGljIHVpbnQ4X3QgbGF5ZXIgPSAwOwogIFBPUlRDID0gMHgwMDsKICBQT1JUQiAmPSB+KCgweDEgPDwgUE9SVEJfTEFZRVJfNikgfCAoMHgxIDw8IFBPUlRCX0xBWUVSXzcpKTsKICBQT1JUQiAmPSB+KDB4MSA8PFBPUlRCX1JDTEspOwoKCmZvcihpbnQgaSA9IDA7IGk8OCA7IGkrKyl7CiAgbGF5ZXIgPSBjdXJyZW50X2xheWVyKysgJiA3OwogIFBPUlRCICY9IH4oMHgxIDw8IFBPUlRCX1NSQ0xLKTsKICBQT1JURCA9IGN1YmVbaV07CiAgUE9SVEIgfD0gKDB4MSA8PCBQT1JUQl9TUkNMSyk7Cn0KICBQT1JUQiB8PSAoMHgxIDw8IFBPUlRCX1JDTEspOwogIGlmKGxheWVyICA8Nil7CiAgICBQT1JUQyA9ICgweDEgPDwgbGF5ZXIpOwogIH0KICBlbHNlIGlmKGN1cnJlbnRfbGF5ZXIgPT0gNil7CiAgICBQT1JUQiB8PSAoMHgxIDw8IFBPUlRCX0xBWUVSXzYpOwogIH0KICBlbHNlewogICAgUE9SVEIgfD0gKDB4MSA8PCBQT1JUQl9MQVlFUl83KTsKICB9CiAgCn0Kdm9pZCBzZXR1cCgpIHsKICAvLyBwdXQgeW91ciBzZXR1cCBjb2RlIGhlcmUsIHRvIHJ1biBvbmNlOgogIEREUkIgPSAweEZGOwogIEREUkMgPSAweEZGOwogIEREUkQgPSAweEZGOwoKICBQT1JUQiA9IDB4MDA7CiAgUE9SVEMgPSAweDAwOwogIFBPUlREID0gMHgwMDsKCiAgVGltZXIxLmluaXRpYWxpemUoMjUwMCk7CiAgVGltZXIxLmF0dGFjaEludGVycnVwdChjYWxsYmFjayk7IAp9Cgp2b2lkIGxvb3AoKSB7CiAgLy8gcHV0IHlvdXIgbWFpbiBjb2RlIGhlcmUsIHRvIHJ1biByZXBlYXRlZGx5Ogp9Cgo=